package com.atgugu.realtime.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import redis.clients.jedis.Jedis;

import java.sql.Connection;
import java.util.List;

/**
 * @Author lizhenchao@atguigu.cn
 * @Date 2021/12/28 15:30
 */
public class DimUtil {
    public static JSONObject readDimFromPhoenix(Connection phoenixConn, String table, Long id) {
        String sql = "select * from " + table + " where id=?";
        
        Object[] args = {id.toString()};
        List<JSONObject> list = JdbcUtil.queryList(phoenixConn, sql, args, JSONObject.class);
        
        return list.size() == 0 ? new JSONObject() : list.get(0);
    }
    
    public static JSONObject readDim(Connection phoenixConn, Jedis jedis, String table, Long id) {
        // 1. 先从redis读取
        JSONObject dim = readDimFromRedis(jedis, table, id);
        
        if (dim == null) {
            System.out.println(table + " " + id + " 走数据库...");
            // 2. 如果缓存中没有, 从Phoenix读取,
            dim = readDimFromPhoenix(phoenixConn, table, id);
            
            // 3. 再把维度数据存入到缓存中
            writeDimToRedis(jedis, table, id, dim);
            
        } else {
            System.out.println(table + " " + id + " 走缓存...");
        }
        
        return dim;
    }
    
    private static void writeDimToRedis(Jedis jedis, String table, Long id, JSONObject dim) {
        String key = table + ":" + id;
        String value = dim.toJSONString();
            /*jedis.set(key, value);
            jedis.expire(key, 2 * 24 * 60 * 60);*/
        jedis.setex(key, 2 * 24 * 60 * 60, value);
    }
    
    private static JSONObject readDimFromRedis(Jedis jedis, String table, Long id) {
        String key = table + ":" + id;
        String s = jedis.get(key);
        if (s != null) {
            return JSON.parseObject(s);
        }
        return null;
    }
}
/*

string:

key:
表名:id

value:
 json格式字符串





如果设计redis的缓存的数据结构:

方便存取

string

key                     value
"dim_user_info:1"       json格式的字符串

好处: 1. 方便读写 2. 单独的给每条维度设置过期时间

坏处: key的数量比较多, 不方便管理.   其实可以通过一个专门数据来存储维度


list

key                 value
"dim_user_info"     这个表的每行数据的json格式

好处: key比较少, 一张表一个key
坏处: 1. 读不方便
      2. 没有办法给每个数据单独设置过期时间
set




hash
key             field      value
表名              id       json格式字符串
                  id       json格式字符串


优点: key比较少   读写方便
缺点: 每条数据没有办法单独设置过期时间


zset



 */














